package com.cbj.netty.handler;

import com.cbj.netty.util.RPCUtil;
import com.cbj.netty.protocol.Content;
import com.cbj.netty.protocol.Header;
import com.cbj.netty.protocol.PackageMsg;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * 基于自定义协议的解码器，用于拆解byte[]转换成请求头和请求体
 */
public class ServerDecoder extends ByteToMessageDecoder {

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf buf, List<Object> out) throws Exception {
        while(buf.readableBytes()>=99){
            byte[] bytes = new byte[99];
            buf.getBytes(buf.readerIndex(),bytes);// 从哪里读，读多少，但是readindex不变
            Header header = RPCUtil.getObject(bytes);
            long requestId = header.getRequestId();
            if(buf.readableBytes() >= header.getDateLen()){
                buf.readBytes(99);
                byte[] msgBodyByte = new byte[(int) header.getDateLen()];
                buf.readBytes(msgBodyByte);
                if(header.getFlag()==0x12121212){
                    Content msgBody = RPCUtil.getObject(msgBodyByte);
                    // 由于decode是客户端和服务端公用的，所以需要根据flag判断是客户端还是服务端
                    out.add(new PackageMsg(header,msgBody));
                }else if(header.getFlag()==0x12121213){
                    Content msgBody = RPCUtil.getObject(msgBodyByte);
                    out.add(new PackageMsg(header,msgBody));
                }
            }else{
                break;
            }
        }

}
}